/**
 * @file drv_pt100.c
 * @brief PT100 温度传感器驱动层实现（DMA 模式）
 * @date 2025-11-16
 */

#include "drv_pt100.h"
#include "adc.h"
#include <stdbool.h>

// =====================================================
// 私有变量
// =====================================================
static volatile uint16_t s_adc_buffer = 0;      /* DMA 目标缓冲区 */
static volatile bool s_adc_ready = false;       /* ADC 数据就绪标志 */

// =====================================================
// 公共 API 实现
// =====================================================

void drv_pt100_init(void)
{
    HAL_ADCEx_Calibration_Start(&hadc);
}

void drv_pt100_start_conversion(void)
{
    s_adc_ready = false;
    HAL_ADC_Start_DMA(&hadc, (uint32_t*)&s_adc_buffer, 1);
}

bool drv_pt100_is_ready(void)
{
    return s_adc_ready;
}

float drv_pt100_get_temperature(void)
{
    uint16_t adc = s_adc_buffer;
    if (adc == 0 || adc >= 4095) return PT100_TEMP_INVALID;

    float vadc = (float)adc * PT100_ADC_VREF / 4096.0f;
    if (vadc <= 0.01f) return PT100_TEMP_INVALID;

    float r_pt100 = PT100_DIVIDER_R_OHM * vadc / (PT100_ADC_VREF - vadc);
    if (r_pt100 < 10.0f || r_pt100 > 500.0f) return PT100_TEMP_INVALID;

    return (r_pt100 - PT100_R0_OHM) / (PT100_R0_OHM * PT100_ALPHA);
}

/* DMA 完成回调（由 HAL 库调用） */
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc_ptr)
{
    if (hadc_ptr->Instance == ADC1)
    {
        s_adc_ready = true;
    }
}
